#pragma once

#include "Constant.hpp"
#include "Transformation.hpp"


//地球时(Terrestrial Time，TT) 
/// > 由地球力学时(Terrestrial Dynamical Time，TDT) 在1991年TDT重新更名为地球时(Terrestrial Time，TT)。

//世界时(  Universal Time，UT) 表示每天从午夜开始的格林尼治平时,
/// > 1924年2月5日开始，格林尼治天文台负责每隔一小时向全世界发放调时信息.


//林尼治平恒星时(Greenwich sidereal time, GST)


class CDynamicalTime
{
public:
    /**
    * @brief 二次曲线外推。推断;
    *      [dt_ext]
    * @param year 
    *                年份;
    * @param leapSecond 
    *                闰秒;
    * @return double 
    */
    static double Extrapolated(double year, double leapSecond) noexcept;

    /**
     * @brief 计算世界时与原子时之差,传入年;
     *      [dt_calc]
     * @param y 
     *           年份;
     * @return double 
     */
    static double DeltaT(double y) noexcept;

    //
    /**
     * @brief 计算TD-UT(单位:日);
     *        [dt_T]
     * @param T 
     *      传入儒略日(J2000起算);
     * @return double 
     */
    static double TDUT(double T) noexcept;
    
    /**
     * @brief 转格林尼治平恒星时;
     *   [pGST2];
     * @param t 
     *         2000年首起算的日数(UT);
     * @param dt 
     *          deltatT(日),精度要求不高时dt可取值为0;
     * @return double 格林尼治平恒星时(不含赤经章动及非多项式部分),即格林尼治子午圈的平春风点起算的赤经;
     */
    static double pGST(double ut, double dt) noexcept
    {
        //力学时(世纪数);
        double T = (ut + dt)/36525.0;
        double T2 = T * T;
        double T3 = T2 * T;
        double T4 = T3 * T;

       double result = Constants::PI2 * (0.7790572732640 + 1.00273781191135448 * ut) + Transformation::ArcsecToRadians (0.014506 + 4612.15739966*T + 1.39667721 * T2 - 0.00009344 * T3 + 0.00001882 * T4);

        return result;
    }
    /**
     * @brief  转格林尼治平恒星时;
     *   [pGST]
     * @param jd 
     *           力学时J2000起算日数;
     * @return double 平恒星时;
     */
     //Siderealtime
    static double pGST(double jd) noexcept
    {
        double dt = DeltaT(jd);
        return pGST(jd - dt, dt);
    }
};